/*
 * @Description: 权限效验
 * @Autor: 人生
 * @Date: 2020-09-27 16:00:44
 * @,@LastEditors: ,: 人生
 */
import store from "@/store";
import storage from "store";
import { ACCESS_TOKEN } from "@/store/mutation-types";
import notification from "ant-design-vue/es/notification";
import router from "./index";
/** 白名单 */
const allowList = ["/login", "/register"];
// 登录权限校验
const loginPermission = async function(to, from, next) {
  if (storage.get(ACCESS_TOKEN)) {
    // 登录过 访问登录页面 跳转到首页
    if (to.path === "/login") {
      next("/");
    } else {
      // 菜单权限效验
      menuPermisson(to, from, next);
    }
  } else {
    // 在免登录名单，直接进入
    if (allowList.includes(to.path)) {
      next();
    } else {
      // 没登录 但是访问这个页面需要登录
      next({ path: "/login", query: { redirect: to.fullPath } });
    }
  }
  next();
};
// 菜单权限效验
const menuPermisson = async function(to, from, next) {
  // console.log('to-====',to);
  // console.log('from-====',from);
  //防止同一个路由多次触发，但会导致初始进入不跳转，后续解决！！！！
  // if(to.path === from.path) return next()
  // if (store.getters.roles.length === 0) {
    store
      .dispatch("user/GetInfo")
      .then(res => {
        const roles = res.roles ;
        // 将后台返回的权限列表和路由表的权限字段进行比对，过滤到无权限的路由，生成新的权限表
        store.dispatch("permission/GenerateRoutes", { roles }).then(() => {
          // 根据roles权限生成可访问的路由表
          //重置路由信息
          // router.matcher = createRouter().matcher
          //添加重定向路由
          let path =  store.getters.addRouters[0].children[0].path
          store.getters.addRouters[0].redirect = path
          // 动态添加可访问路由表
          router.addRoutes(store.getters.addRouters);
          // 请求带有 redirect 重定向时，登录自动重定向到该地址
          const redirect = decodeURIComponent(from.query.redirect);
          console.log('redirect',redirect === 'undefined');
          if (!redirect || redirect === 'undefined') {
            //登录过,没有重定向,想干什么就干什么
            next({ ...to, replace: true });
          } else {
            // 跳转到目的路由
            next({ path: redirect });
          }
        });
      })
      .catch(() => {
        notification.error({
          message: "错误",
          description: "请求用户信息失败，请重试"
        });
        // 失败时，获取用户信息失败时，调用登出，来清空历史保留信息
        store.dispatch("user/Logout").then(() => {
          next({ path: "/login", query: { redirect: to.fullPath } });
        });
      });
  // } else {
  //   next();
  // }
};

export { loginPermission };
